
#include<bits/stdc++.h>
using namespace std;


//C++IO里面有一种特殊的类型转换

class ConvertTo   
{
    public:
    operator int()
    {
        return 1;
    }
};
int TestConvert()
{
    // cout.put(49);//输出字符1
    // string s1;
    // while(cin>>s1)
    // {
    //     cout<<s1<<endl;
    // }
    ConvertTo c1;
    cout<<c1<<endl;//这里能运行出1的结果，实际就是因为cout没法识别更好的类型，而转换成了int
    return 0;
}



//二进制读写
class BinIO{
    string _filename;
    public:
    BinIO(string filename)
    {
        _filename= filename;
    }
    void BinaryWrite()
    {
        ofstream ofs(_filename,ios_base::out|ios_base::binary);
        ofs.write((char*)"1wee3",100);
    }
    void BinaryRead()
    {
        char s[100];
        ifstream ifs(_filename);
        ifs.read((char*)&s,sizeof(s));
        cout<<s<<endl;
   }
};
//！！！！！！！！！！！！
//因为二进制读写是纯粹的拷贝，所以读写不在同一进程会出现野指针
//即使是在同一进程，会出现浅拷贝的情况，也就是另外的一个string，也会有这块空间，造成二次释放的问题
//因此要尽量避免读写容器 
int TestBinIO()
{
    char filename[200] = "test.txt";
    BinIO b1(filename);
    b1.BinaryWrite();
    b1.BinaryRead();
    return 0;
}



//文本IO，C++使得文件流继承于istream和ostream
//因此我们在内置类型进行读写的时候，可以直接使用文件IO就好
//相对的如果是自定义类型，我们只需要进行
class Info{
    friend class ostream;
    friend class istream;
    public:
    Info(int d=0,int m=0,int y=0)
    {
        day = d;
        month = m;
        year = y;
    }
    int year;
    int month;
    int day;
};

ostream& operator <<(ostream& os,Info&d)
{
    return os<<d.day<<endl<<d.month<<endl<<d.year<<endl;
};
istream& operator>>(istream& is,Info&d)
{
    return is>>d.day>>d.month>>d.year;
}



int TestTextIO()
{
    char *filename = "a.txt";
    Info a(12,23,34);
    ofstream ofs(filename,ios_base::app);
    ofs<<a;
    ifstream ifs(filename);
    Info b;
    while(ifs>>b)
    {
        cout<<b;
    }
    return 0;
}



int main()
{
    std::string stringValues = "125 320 512 750 333";
    std::istringstream iss (stringValues);
    string ostValue;
    ostringstream oss(ostValue,ios_base::out);
    for (int n=0; n<5; n++)
    {
        int val;
        iss >> val;
        oss << val<<' ';
        std::cout << val*2 << '\n';
    }
    oss.flush();
    cout<<ostValue;
    cout<<oss.str();
    return 0;
}